package org.budo.alipay.util;

import java.net.URL;
import java.util.List;

import org.budo.alipay.BudoAlipayConfig;
import org.budo.support.spring.util.SpringUtil;
import org.dom4j.Document;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import lombok.Getter;
import lombok.Setter;

/* *
 *类名：AlipaySubmit
 *功能：支付宝各接口请求提交类
 *详细：构造支付宝各接口表单HTML文本，获取远程HTTP数据
 *版本：3.3
 *日期：2012-08-13
 *说明：
 *以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
 *该代码仅供学习和研究支付宝接口使用，只是提供一个参考。
 */
@Getter
@Setter
public class AlipaySubmit {

    /**
     * 用于防钓鱼，调用接口query_timestamp来获取时间戳的处理函数 注意：远程解析XML出错，与服务器是否支持SSL等配置有关
     * 
     * @return 时间戳字符串
     */
    public String query_timestamp() throws Exception {
        BudoAlipayConfig conf =SpringUtil.getBean(BudoAlipayConfig.class);

        // 构造访问query_timestamp接口的URL串
        String strUrl = conf.getGateway() + "service=query_timestamp&partner=" + conf.getPartnerMerchant() + "&_input_charset" + conf.getInputCharset();
        StringBuffer result = new StringBuffer();

        SAXReader reader = new SAXReader();
        reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
        reader.setFeature("http://xml.org/sax/features/external-general-entities", false);
        reader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
        Document doc = reader.read(new URL(strUrl).openStream());

        List<Node> nodeList = doc.selectNodes("//alipay/*");

        for (Node node : nodeList) {
            // 截取部分不需要解析的信息
            if (node.getName().equals("is_success") && node.getText().equals("T")) {
                // 判断是否有成功标示
                List<Node> nodeList1 = doc.selectNodes("//response/timestamp/*");
                for (Node node1 : nodeList1) {
                    result.append(node1.getText());
                }
            }
        }

        return result.toString();
    }
}
